// 数据类型、变量区别常量、全局变量、局部变量、scanf、作用域、生命周期、4种常量、字符串、转义字符、注释、strlen

//1.写出主函数（main函数）
//一份代码中可以有很多行，但是执行是从主函数的第一行开始执行
//main函数是整个代码的入口
//函数后带一对括号，main为函数名，{}之内的叫做函数体
//int为函数的返回类型，整型的意思
//printf-库函数-在屏幕上打印信息 
//调用printf库函数需要引用头文件stdio.h

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("Hello World!\n");
    printf("你好世界!\n");
    system("pause");    // 防止运行后自动退出，需头文件stdlib.h
    return 0;
}


//---------------------------------------------小节分割线--------------------------------------------

//不同数据类型所占大小如何查看、常量与变量的定义、不同数据类型的打印
//char       字符数据类型  'a'
//short      短整型
//int        整形，打印使用%d
//long       长整型
//long long  更长的整形
//float      单精度浮点数  小数，打印使用%f
//double     双精度浮点数 精度比float更高，打印使用%lf
//不同数据类型是为了提高空间利用率，选择更合适的存储方式
//计算机中的单位：
//bit - 比特位 - 存储一个二进制位（最小单位）
//byte - 字节 = 8bit
//kb = 1024byte
//继续就是mb、gb、tb、pb

// int main()
// {
//     //任何数据的存储都需要空间，char ch就是使用char类型创建了一个叫做ch的空间
//     //将字符'a'放进ch这个变量空间中去
//     //存储字符
//     char ch = 'a';
//     //打印整数
//     //printf("%d\n", 100);
//     //sizeof - 关键字 - 操作符 - 计算类型或者变量所占空间的大小
//     //sizeof的单位 - 字节byte
//     //打印不同数据类型所占大小
//     // printf("char:%d\n", sizeof(char));//1
//     // printf("short:%d\n", sizeof(short));//2
//     // printf("int:%d\n", sizeof(int));//4
//     // printf("long:%d\n", sizeof(long));//4  sizeof(long)>=sizeof(int)可以取等于
//     // printf("long long:%d\n", sizeof(long long));//8
//     // printf("float:%d\n", sizeof(float));//4
//     // printf("double:%d\n", sizeof(double));//8

//     // 类型 变量的名字 = 初始值；
//     int age = 25;// 创建一个变量
//     float weight = 73.3;
//     age += 1;  // 对变量进行更改
//     weight -= 5;
//     printf("age:%d\n",age);
//     printf("weight:%f\n",weight);

//     return 0;
// }

//---------------------------------------------小节分割线--------------------------------------------


//全局变量
// int a = 100;
// int main()
// {
//     //大括号{}内部的变量都属于局部变量
//     int a = 0;
//     int b = 0;
//     int sum = 0;
//     printf("a = %d\n",a);
//     //全局与局部变量名相同时的局部内输出，输出局部变量，但不推荐。
//     printf("b = %d\n",b);
//     printf("输入a和b的值：");
//     scanf("%d %d", &a, &b);
//     //scanf函数用来输入，输入的格式要严格按照""内的格式，包括空格。
//     printf("a = %d\n",a);
//     printf("b = %d\n",b);
//     sum = a + b;
//     printf("sum = %d\n",sum);
//     return 0;
// }

//---------------------------------------------小节分割线--------------------------------------------

//变量的作用域和生命周期
// 作用域：变量可以使用的区域。
// 局部变量的作用域就是他所在的局部范围，全局变量的作用域是整个工程
// 在同一个工程的其他文件中定义的全局变量，声明后即可使用，例如下

// extern int g_c; //同一个工程中其他文件中定义过g_c变量，就可以使用extern声明，就可以直接调用
// int g_b = 2333;// 全局变量
// int main()
// {
//     printf("全局变量b的第1次打印：%d\n",g_b);
//     printf("下面大括号内的a的作用域，无法触及之后的printf\n");
//     {
//         int a = 10;
//         printf("全局变量b的第2次打印：%d\n",g_b);
//     }
//     int a = 10;
//     printf("a = %d\n",a);
//     printf("全局变量b的第3次打印：%d\n",g_b);
//     return 0;
// }

// 生命周期：变量的创建到销毁之间的时间段
// 局部变量的生命周期：进入局部范围开始，出局部范围声明结束
// 全局变量的生命周期：程序的生命周期

//---------------------------------------------小节分割线--------------------------------------------

// 常量
// #define MAX 10000  //3.#define 定义的标识符常量 中使用
// enum Sex   // 4.枚举常量 中使用
// {
//     // 枚举类型的变量的未来可能取值，只有这三种，只能是这三个中的其中一个
//     MALE,  // 这里默认MALE = 0，后面两个就是1,2；如果赋初值为MALE = 3，那么后面两个就是4，5
//     FEMALE,
//     SECRET
// };
// int main()
// {
//     // 1.字面常量
//     3.14;
//     10;
//     'a';

//     // 2.const修饰的常变量
//     // int num = 10; // num是一个变量，是可变的
//     // // const int num = 10; // num是一个常变量，具有常属性（不可被改变的属性）
//     // num = 20; // 更改num的值
//     // printf("num的值为%d\n", num);
//     // int arr[10] = {0}; // 定义一个数组，10个元素
//     // //int n = 10;
//     // const int n = 10;
//     // int arr2[n] = {0}; // 不管n是变量还是常变量，都不能用来确定数组的个数，只能用常量。

//     // 3.#define 定义的标识符常量
//     // int n = MAX;
//     // printf("n = %d\n", n);

//     // 4.枚举常量
//     // 可以一一列出来的常量
//     enum Sex s = MALE;
//     printf("MALE的值为%d\n", MALE);
//     printf("FEMALE的值为%d\n", FEMALE);
//     printf("SECRET的值为%d\n", SECRET);

//     return 0;
// }

//---------------------------------------------小节分割线--------------------------------------------

//字符串、转义字符、注释、strlen
// 字符串：用双引号""括起来的一串字符
#include<string.h>
int main()
{
    //字符数组-数组是一组相同类型的元素
    //char arr[] = "hello";
    // 可以使用调试看到，字符串的结尾位置隐藏了一个\0的字符，这是字符串的结束标志

    char arr1[] = "xyzst";
    char arr2[] = {'a', 'b'};
    char arr3[] = {'o', 'p', 'q', '\0'};
    printf("arr1:%s\n",arr1);
    printf("arr2:%s\n",arr2);
    printf("arr3:%s\n",arr3);
    
    // // arr2打印过程中，没有在打印abc后停下来，而是继续打印内容，是因为内存中arr2后面还有存储的数据
    // //一直要打印到出现了\0才能结束。

    // 求字符串的长度，使用函数strlen（string length的意思），需要引用头文件<string.h>
    int len = strlen("abc");
    printf("“abc”的len:%d\n",len);//结果是3，所以说\0这个隐藏字符只是作为结束标志，计算长度的时候是不计算的
    printf("arr1的len:%d\n",strlen(arr1));
    printf("arr2的len:%d\n",strlen(arr2)); //长度是随机值
    printf("arr3的len:%d\n",strlen(arr3));
    return 0;

}